package advance.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * 泛型的本质
 */
public class ReflectionDemo05 {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList list = new ArrayList();

        ArrayList<String> list1 = new ArrayList<>();
        list1.add("hello");

        Class c1 = list.getClass();
        Class c2 = list1.getClass();
        System.out.println(c1 == c2); //true，反射的操作都是编译之后的操作

        /**
         * c1 == c2 结果返回 true 说明编译之后集合的泛型是去泛型化的(类型擦除)
         * Java 中集合的泛型，是防止错误输入的，只在编译阶段有效
         * 绕过编译就无效了
         * 通过方法反射来错做，绕过编译，反射 add 方法绕过编译，如果类型不一致使用 Foreach 遍历会报错
         */
        Method m = c2.getMethod("add", Object.class);
        m.invoke(list1, 100);
        System.out.println(list1.size());
    }

}
